

// 对防抖处理进行封装   => 传入需要处理的函数,和时间 => 返回对应的防抖处理函数
function debounce(callback, delay = 300) {
    var timer = null;
    return function (...list) { // 防抖处理函数(添加延时器) => 如果函数短时间内(300ms)连续触发 => 先清除上一次,在启动下一次
        // this -> searchCon
        // list => 将debcounceHandler接收的参数存到数组中


        clearTimeout(timer);
        timer = setTimeout(() => {
            // callback(); // search函数调用是没有依存的对象(this->window),也没有事件对象
            // callback.call(this, ...list); // 此写法this直线已经处理好了,将debcounceHandler接收的参数依次传到数组中
            callback.apply(this, list); // 此写法this直线已经处理好了,将debcounceHandler接收的参数依次传到数组中
        }, delay);
    };
}


function throttle(callback, delay = 300) {
    var start = Date.now(); // 页面加载时存一个起始时间
    return function (...list) {  //节流处理函数
        // this -> window
        // e -> 事件对象
        var end = Date.now();  // 每次函数执行时 存一个执行时间
        if (end - start >= delay) {
            // callback();
            // callback.call(this, ...list);
            callback.apply(this, list);
            start = end; // 本次函数执行后,start重新记录当前结束时间 => 下次触发需要比当前时间多至少300ms
        }
    }
}



function currying(callback) {
    var list = []
    return function curryingHandler() {  // currying处理函数

        if (arguments.length > 0) {  // 有参数就存储到数组中,并可以继续接受参数
            list.push(...arguments);
            return curryingHandler.bind(this); // 如果有参数 => 将this指向传递给下一个curryingHandler函数
        } else { // 没有参数 => 调用函数(参数全都传输完毕)
            var result = callback.call(this, ...list);
            list.length = 0;  // 清空原数组
            return result;
        }
    }
}
